package com.fruit.service.logistics;

import com.fruit.pojo.logistics.*;

/**
 * 快递接口
 *
 * @author joe
 * @version 2018.02.05 15:11
 */
public interface LogisticsService {
    /**
     * 注册监听器（该方法不能远程调用，请在该服务的实现类LogisticsServiceImpl中调用）
     * <p>
     * 后续会给出代替解决方案
     *
     * @param listener 监听器
     */
    void register(RouteListener listener);

    /**
     * 路由通知，请勿调用！！
     *
     * @param data 路由通知内容
     * @param type 路由通知快递类型
     * @return 转换后的系统路由
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysRoute routeNotify(String data, LogisticsType type) throws NoSuitableProxyException;

    /**
     * 发快递，系统自动确定使用哪家快递
     *
     * @param logistics 要发的快递信息
     * @return 发送结果
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysLogisticsOrderResponse send(SysLogistics logistics) throws NoSuitableProxyException;

    /**
     * 发快递
     *
     * @param type      指定使用的快递商家
     * @param logistics 要发的快递信息
     * @return 发送结果
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysLogisticsOrderResponse send(LogisticsType type, SysLogistics logistics) throws NoSuitableProxyException;

    /**
     * 查询发快递的结果
     *
     * @param type    快递商家
     * @param orderId 订单ID（需要与发快递时传递的值一致）
     * @return 发快递接口的调用结果
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysLogisticsOrderResponse searchSend(LogisticsType type, String orderId) throws NoSuitableProxyException;

    /**
     * 查找路由
     *
     * @param type  快递商家
     * @param id    单号ID
     * @param isSys 是否是系统单号（true表示传入的ID是系统订单号，false表示传入ID时快递运单号）
     * @return 路由结果
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysRouteResponse searchRoute(LogisticsType type, String id, boolean isSys) throws NoSuitableProxyException;

    /**
     * 查询时效
     *
     * @param type    要查询的快递商家
     * @param deliver 查询参数
     * @return 查询结果
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysDeliverResponse searchDeliver(LogisticsType type, SysDeliver deliver) throws NoSuitableProxyException;

    /**
     * 查询时效
     *
     * @param type    要查询的快递商家
     * @param deliver 查询参数
     * @return 查询结果
     * @throws NoSuitableProxyException 当没有合适的快递可以使用时会抛出该异常
     */
    SysNewDeliverResponse searchDeliver(LogisticsType type, SysNewDeliver deliver) throws NoSuitableProxyException;
}
